package bookshelf.client.book;


import java.util.ArrayList;

import bookshelf.client.BookItemService;
import bookshelf.client.BookItemServiceAsync;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
//import com.google.gwt.sample.mail.client.Mail;
//import com.google.gwt.sample.mail.client.MailItem;
//import com.google.gwt.sample.mail.client.MailItems;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
//import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlexTable;
//import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HTMLTable.Cell;

public class BookList extends Composite implements ClickHandler {

	private BookController bcntrl;
	
	private FlexTable booksFlexTable = new FlexTable();
	private static final int VISIBLE_BOOKS_CNT = 10;

	// コンストラクタ
	public BookList() {
		
		bcntrl = BookController.getBookController();

		// 列間の隙間の設定
		booksFlexTable.setCellSpacing(1);
		booksFlexTable.setCellPadding(3);
		booksFlexTable.setWidth("100%");

		// Hook up events.
		booksFlexTable.addClickHandler(this);

		// Widget初期化必須
		initWidget(booksFlexTable);
		//cssスタイル設定
		setStyleName("book-List");

		initTable();
		updateBookList();

	}

	//BookController setter/getter
	public BookController getBookController() {
		return bcntrl;
	}

	public void setBookController(BookController bc) {
		this.bcntrl = bc;
	}

	// 本一覧の初期化
	private void initTable() {

		// ヘッダ行の設定
		booksFlexTable.setText(0, 0, "題名");
		booksFlexTable.setText(0, 1, "著者");
		booksFlexTable.setText(0, 2, "シリーズ／文庫");
		booksFlexTable.setText(0, 3, "分類");
		booksFlexTable.setText(0, 4, "購入日");
		booksFlexTable.setText(0, 5, "処分日");
		//ヘッダ行の外観など設定
		booksFlexTable.getCellFormatter().setWordWrap(0, 0, false);
		booksFlexTable.getCellFormatter().setWordWrap(0, 1, false);
		booksFlexTable.getCellFormatter().setWordWrap(0, 2, false);
		booksFlexTable.getCellFormatter().setWordWrap(0, 3, false);
		booksFlexTable.getCellFormatter().setWordWrap(0, 4, false);
		booksFlexTable.getCellFormatter().setWordWrap(0, 5, false);
		booksFlexTable.getRowFormatter().setStyleName(0, "book-ListHeader");

		// Initialize the rest of the rows.
		for (int i = 0; i < VISIBLE_BOOKS_CNT; ++i) {
			booksFlexTable.setText(i + 1, 0, "");
			booksFlexTable.setText(i + 1, 1, "");
			booksFlexTable.setText(i + 1, 2, "");
			booksFlexTable.setText(i + 1, 3, "");
			booksFlexTable.setText(i + 1, 4, "");
			booksFlexTable.setText(i + 1, 5, "");
			booksFlexTable.getCellFormatter().setWordWrap(i + 1, 0, false);
			booksFlexTable.getCellFormatter().setWordWrap(i + 1, 1, false);
			booksFlexTable.getCellFormatter().setWordWrap(i + 1, 2, false);
			booksFlexTable.getCellFormatter().setWordWrap(i + 1, 3, false);
			booksFlexTable.getCellFormatter().setWordWrap(i + 1, 4, false);
			booksFlexTable.getCellFormatter().setWordWrap(i + 1, 5, false);
			// booksFlexTable.getFlexCellFormatter().setColSpan(i+1, 2, 2);
		}
	}



	// 本データの設定
	private void updateBookList() {

		// 表示する本データを取得
		getBooks();


//		if(bcntrl ==null){
//			System.out.println("null");
//			return;
//		}
//
//		ArrayList<BookItem> result = bcntrl.getBooks();		
//		if(result == null){
//			return;
//		}
//
//		//表示部へ設定
//		int i = 0;
//		for (; i < result.size(); i++) {
//			BookItem bi = result.get(i);
//			booksFlexTable.setText(i + 1, 0, bi.getTitle());
//			booksFlexTable.setText(i + 1, 1, bi.getAuthor());
//			booksFlexTable.setText(i + 1, 2, bi.getPublisher());
//			booksFlexTable.setWidget(i + 1, 4, new Button("処分"));
//		}
//
//		// ブランク行をパディング
//		for (; i < VISIBLE_BOOKS_CNT; ++i) {
//			booksFlexTable.setHTML(i + 1, 0, "&nbsp;");
//			booksFlexTable.setHTML(i + 1, 1, "&nbsp;");
//			booksFlexTable.setHTML(i + 1, 2, "&nbsp;");
//			booksFlexTable.setHTML(i + 1, 3, "&nbsp;");
//			booksFlexTable.setHTML(i + 1, 4, "&nbsp;");
//		}
}
	
	/**
	 * Create a remote service proxy to talk to the server-side Greeting service.
	 * リモートサービスプロキシを生成
	 */
	private final BookItemServiceAsync bookItemService = GWT.create(BookItemService.class);
	final ArrayList<BookItem> booklist = new ArrayList<BookItem>();

	public void getBooks(){
		
		bookItemService.getBookItemList(new AsyncCallback<ArrayList<BookItem>>() {
			public void onFailure(Throwable caught) {
				// 非同期通信エラー発生時の処理
				caught.printStackTrace();
			}

			// 通信成功した場合の処理
			public void onSuccess(ArrayList<BookItem> result) {
				//ArrayListのクリア
				booklist.clear();
				
				//入れ物詰め替え
				for(int j=0;j<result.size();j++){
					booklist.add(result.get(j));					
				}

				//表示部へ設定
				int i = 0;
				for (; i < booklist.size(); i++) {
					BookItem bi = booklist.get(i);
					booksFlexTable.setText(i + 1, 0, bi.getTitle());
					booksFlexTable.setText(i + 1, 1, bi.getAuthor());
					booksFlexTable.setText(i + 1, 2, bi.getSeries());
					booksFlexTable.setWidget(i + 1, 5, new Button("処分する"));
					booksFlexTable.setWidget(i + 1, 6, new Button("修正する"));
				}

				// ブランク行をパディング
				for (; i < VISIBLE_BOOKS_CNT; ++i) {
					booksFlexTable.setHTML(i + 1, 0, "&nbsp;");
					booksFlexTable.setHTML(i + 1, 1, "&nbsp;");
					booksFlexTable.setHTML(i + 1, 2, "&nbsp;");
					booksFlexTable.setHTML(i + 1, 3, "&nbsp;");
					booksFlexTable.setHTML(i + 1, 4, "&nbsp;");
					booksFlexTable.setHTML(i + 1, 5, "&nbsp;");
					booksFlexTable.setHTML(i + 1, 6, "&nbsp;");
				}

			}
		});
	}



	// 選択中の列を保持
	private int selectedRow = -1;

	@Override
	public void onClick(ClickEvent event) {
		// TODO Auto-generated method stub
		//イベントの発生元GUI部品を取得
		Object sender = event.getSource();

		if (sender == booksFlexTable) {
			// Select the row that was clicked (-1 to account for header row).
			//選択されたセルを取得する。
			Cell cell = booksFlexTable.getCellForEvent(event);

			if (cell != null) {
				//選択されたセルの行を取得
				int row = cell.getRowIndex();
				if (row > 0) {
					selectRow(row - 1);
				}
			}
		}
	}

	private void selectRow(int row) {
		// When a row (other than the first one, which is used as a header) is
		// selected, display its associated MailItem.
		// MailItem item = MailItems.getMailItem(startIndex + row);
		// if (item == null) {
		// return;
		// }

		//選択していた行の色を反転解除、新たに選択された行を反転
		styleRow(selectedRow, false);
		styleRow(row, true);
		selectedRow = row;
		//TODO BookItemの持ち方
		BookItem tempbi=new BookItem();
		tempbi.setTitle(booksFlexTable.getText(row+1, 0));
		tempbi.setAuthor(booksFlexTable.getText(row+1, 1));
		tempbi.setPublisher(booksFlexTable.getText(row+1, 2));
		bcntrl.setBookItemToDetail(tempbi);

		//item.read = true;
		// Mail.get().displayItem(item);
	}

	//選択した行の色反転、反転解除
	private void styleRow(int row, boolean selected) {
		if (row != -1) {
			if (selected) {
				booksFlexTable.getRowFormatter().addStyleName(row + 1,
						"book-SelectedRow");
			} else {
				booksFlexTable.getRowFormatter().removeStyleName(row + 1,
						"book-SelectedRow");
			}
		}
	}
}
